<?php
/*
 * @开发工具: JetBrains PhpStorm.
 * @文件名：IJuHe.class.php
 * @类功能: https://www.juhe.cn/
 * @开发者: cxl
 * @开发时间： 15-03-31
 * @版本：version 1.0
 */
namespace app\common\ext;

use app\common\enum\AppType;
use app\common\enum\IsDelete;
use app\common\enum\SmsStatus;
use think\Config;

class ISms{
    //静态变量定义
    private static $SmsUrl = "http://cf.51welink.com/submitdata/service.asmx/g_Submit"; //短信接口的URL

    //短信模板定义
    const YhVerificationCode = "【有度】您的验证码是{1},请于10分钟内正确输入，如非本人操作，请忽略此短信；"; //短信验证码
    const XdVerificationCode = "【有度获客】您的验证码是{1},请于10分钟内正确输入，如非本人操作，请忽略此短信；"; //短信验证码
    const HzVerificationCode = "【有度合作商】您的验证码是{1},请于10分钟内正确输入，如非本人操作，请忽略此短信；"; //短信验证码

    /**
     * @功能：发送短信
     * @param $app_type string APP类型
     * @param $phone string 电话号码
     * @return array
     */
    public static function getCode($app_type,$phone){
        //获取验证码列表
        $com_sms_where['app_type'] = array("eq",$app_type);
        $com_sms_where['phone'] = array("eq",$phone);
        $com_sms_where['is_delete'] = array("eq",IsDelete::No);
        $com_sms_list = IDb::getInstance("com_sms") ->setDbFiled("code")->setDbWhere($com_sms_where)->sel();
        if($com_sms_list === false || count($com_sms_list) == 0){
            return array();
        }

        //返回code
        return array_column($com_sms_list,"code");
    }

    /**
     * @功能：取得发送数量
     * @param $app_type string APP类型
     * @param $phone string 电话号码
     * @return array|bool
     */
    public static function getCount($app_type,$phone){
        //获取验证码列表
        $com_sms_where['app_type'] = array("eq",$app_type);
        $com_sms_where['phone'] = array("eq",$phone);
        $com_sms_where['create_time'] = ['egt',date('Y-m-d')];
        $com_sms_count = IDb::getInstance("com_sms")->setDbWhere($com_sms_where)->con();

        //判断code是否存在
        $sms_count = IConfig::getValue("SmsCount");
        if($com_sms_count >= $sms_count){
            return false;
        }
        //发送次数
        return true;
    }

    /**
     * @功能：发送短信验证码
     * @param $app_type string APP类型
     * @param $phone string 电话号码
     * @param $code string 验证码
     * @return bool
     */
    public static function Verification($app_type,$phone,$code){
        //判断模板是否正确
        switch($app_type){
            case AppType::YH:
                $template = self::YhVerificationCode;
                break;
            case AppType::XD:
                $template = self::XdVerificationCode;
                break;
            case AppType::HZ:
                $template = self::HzVerificationCode;
                break;
            default:
                return false;
                break;
        }

        //发送短信
        $template = rawurlencode(str_ireplace("{1}", $code, $template));
        $post = self::Post($phone,$template);

        //判断发送短信是否错误
        if($post === true){
            //写短信日志
            ILog::SmsLog($app_type,$phone,$code,SmsStatus::OK,"发送成功！");

            //返回值
            return true;
        }else{
            //写短信日志
            ILog::SmsLog($app_type,$phone,$code,SmsStatus::NG,$post);

            //返回值
            return true;
        }
    }

    /**
     * @功能：发送短信
     * @param $template string 短信模板
     * @param $phone string 电话号码
     * @param $param array 参数
     * @return bool
     */
    public static function Send($phone,$template,$param=array()){
        //判断模板是否正确
        if(in_array($template,array(self::XdVerificationCode,self::YhVerificationCode))){
            return false;
        }

        //判断是否需要发送短信
        if(empty($phone)){
            return false;
        }

        //循环替换参数
        foreach($param as $code=>$item) {
            //初期化参数编号
            $code = intval($code + 1);

            //替换参数
            $template = rawurlencode(str_ireplace("{{$code}}", $item, $template));
        }

        //发送短信
        $post = self::Post($phone,$template);

        //判断发送是否成功
        if($post === true){
            return true;
        }else{
            return true;
        }
    }

    /**
     * @功能：发送短信
     * @param $phone string 电话号码
     * @param $msg string 发送消息
     * @return bool
     */
    private static function Post($phone,$msg) {
        //初始化变量
        $user = Config::get("sms.user");
        $pwd = Config::get("sms.pwd");
        $pid = Config::get("sms.pid");
        $did = Config::get("sms.did");

        //取得发送信息
        $data = "sname={$user}&spwd={$pwd}&scorpid={$pid}&sprdid={$did}&sdst={$phone}&smsg={$msg}";

        //配置参数
        $url_info = parse_url(self::$SmsUrl);
        $http_header = "POST " . $url_info['path'] . " HTTP/1.0\r\n";
        $http_header .= "Host:" . $url_info['host'] . "\r\n";
        $http_header .= "Content-Type:application/x-www-form-urlencoded\r\n";
        $http_header .= "Content-Length:" . strlen($data) . "\r\n";
        $http_header .= "Connection:close\r\n\r\n";
        $http_header .= $data;

        //创建sock通讯
        $fd = fsockopen($url_info['host'], 80);
        fwrite($fd, $http_header);

        //取得返回包内容
        $content = null;
        while(!feof($fd)) {$content .= fread($fd, 128);}

        //关闭连接
        fclose($fd);

        //判断内容是否正确
        if(!empty($content)){
            //获取数据位置
            $start = strpos($content, '<?xml version');

            //判断是否为xml格式数据
            if($start > 0) {
                //取得数据
                $content = substr($content, $start);

                //判断是否为数组
                $content_array = IXml::xmlToArray($content);
                if(isset($content_array['State']) && $content_array['State'] == 0){
                    return true;
                }else{
                    return $content_array['MsgState'];
                }
            }
        }

        //返回错误信息
        return "未知异常！";
    }
}
